﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using DAL.Entities;
using DAL.Eceptions;
using BAL;
using System.Configuration;

namespace GrouponDesktop.ComprarCupon
{
    public partial class ComprarCuponFrm : Form
    {
        private string _fechaActual;
        private ClienteEntity _cliente;
        private ClienteBAL _clienteBal;
        private CuponBAL _cuponBAL;
        private bool _primeraCarga;

        public ComprarCuponFrm(UsuarioEntity usuario)
        {
            InitializeComponent();
            this.CancelButton = this.btnSalir;
            this._cuponBAL = new CuponBAL();
            this._primeraCarga = true;

            this._fechaActual = ConfigurationSettings.AppSettings["actualDate"].ToString();
            this.lblFechaActual.Text = this._fechaActual;
            this.lblUsuario.Text += usuario.VarUsername;

            this._clienteBal = new ClienteBAL();
            this._cliente = this._clienteBal.GetClienteByUserId(usuario.IntIdUsuario);
            this.lblSaldo.Text += this._cliente.FloatSaldo.ToString();

            this.dgwCupones.CellContentClick += new DataGridViewCellEventHandler(btnClick);

            this.CargarComboCiudades();
            this.CargarGrillaCupones();
            this.AgregarBotonComprar();
        }

        void btnClick(object sender, DataGridViewCellEventArgs e)
        {
            if (this.dgwCupones.Columns[e.ColumnIndex].Name == "btnComprar")
            {
                try
                {
                    DataGridViewRow rw = this.dgwCupones.Rows[e.RowIndex];

                    string codigoCupon = rw.Cells["Codigo"].Value.ToString();
                    int stock = Convert.ToInt32(rw.Cells["Stock"].Value);
                    int cantMaxXCli = Convert.ToInt32(rw.Cells["CantMax"].Value);
                    float precio = (float)Convert.ToDecimal(rw.Cells["Precio"].Value.ToString().Replace("$", ""));

                    if (precio <= this._cliente.FloatSaldo)
                    {
                        if (MessageBox.Show("Estas comprando el cupon precio $" + precio + Environment.NewLine + "Confirmar",
                            "Comprar Cupon", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
                        {
                            try
                            {
                                this.ComprarCupon(codigoCupon, stock, cantMaxXCli, this._cliente.IntIdCliente, this._fechaActual);
                                
                                //Resto el saldo del cliente
                                this._cliente.FloatSaldo = this._cliente.FloatSaldo - precio;
                                this.lblSaldo.Text = "Su saldo es: $" + this._cliente.FloatSaldo.ToString();
                                this.CargarGrillaCupones();
                                MessageBox.Show("La compra se realizo correctamente" + Environment.NewLine + "Codigo de cupon: " + codigoCupon, "Comprar Cupon", MessageBoxButtons.OK, MessageBoxIcon.Information);
                            }
                            catch (CuponSinStockException ex)
                            {
                                MessageBox.Show(ex.Message, "Comprar Cupon", MessageBoxButtons.OK, MessageBoxIcon.Information);
                            }
                            catch (CliSuperaCantMaxException ex)
                            {
                                MessageBox.Show(ex.Message, "Comprar Cupon", MessageBoxButtons.OK, MessageBoxIcon.Information);
                            }
                        }
                    }
                    else
                    {
                        MessageBox.Show("No posee saldo suficiente para comprar este cupon", "Comprar Cupon", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show("Ha ocurrio un error: " + ex.Message, "Comprar Cupon", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
            }
        }

        private void CargarComboCiudades()
        {
            CiudadBAL ciudadBAL = new CiudadBAL();
            List<CiudadEntity> ciudadesPref = ciudadBAL.GetCiudadesByCliente(this._cliente);

            this.cmboCiudades.DataSource = ciudadesPref;

            this.cmboCiudades.ValueMember = "IntIdCiudad";
            this.cmboCiudades.DisplayMember = "VarNombre";

            this.cmboCiudades.SelectedIndex = 0;
            this._primeraCarga = false;
        }

        private void CargarGrillaCupones()
        {
            int idCiudad = Convert.ToInt32(this.cmboCiudades.SelectedValue);
            List<CuponEntity> cupones = this._cuponBAL.GetCuponesByIdCiudad(idCiudad, this._fechaActual);

            DataTable dt = this.CrearDataTableCupones(cupones);
            this.dgwCupones.DataSource = dt;

            //this.AgregarBotonComprar();
            this.ConfigurarDataGrid();

            this.lblCantCupones.Text = "Cupones: " + this.dgwCupones.Rows.Count.ToString();
        }

        private DataTable CrearDataTableCupones(List<CuponEntity> cupones)
        {
            DataTable dt = new DataTable();

            dt.Columns.Add("Codigo", typeof(string));
            dt.Columns.Add("IdProveedor", typeof(int));
            dt.Columns.Add("ProveedorRS", typeof(string));
            dt.Columns.Add("Rubro", typeof(string));
            dt.Columns.Add("Descripcion", typeof(string));
            dt.Columns.Add("Precio", typeof(string));
            dt.Columns.Add("Stock", typeof(int));
            dt.Columns.Add("CantMax", typeof(int));

            foreach (CuponEntity cupon in cupones)
            {
                dt.Rows.Add(cupon.CodigoCupon, cupon.IdProveedor, cupon.ProveeRS, cupon.Rubro, cupon.DetalleCupon.Descripcion, "$" + cupon.DetalleCupon.Precio.ToString(), cupon.Stock, cupon.CantMaximaPorCliente);
            }

            return dt;
        }

        private void AgregarBotonComprar()
        {
            DataGridViewButtonColumn boton = new DataGridViewButtonColumn();

            boton.HeaderText = "Comprar";
            boton.Text = "Comprar";
            boton.Name = "btnComprar";
            boton.UseColumnTextForButtonValue = true;
            boton.AutoSizeMode = DataGridViewAutoSizeColumnMode.None;
            boton.FlatStyle = FlatStyle.Standard;

            this.dgwCupones.Columns.Add(boton);
        }

        private void ConfigurarDataGrid()
        {
            this.dgwCupones.BorderStyle = BorderStyle.FixedSingle;
            this.dgwCupones.ColumnHeadersBorderStyle = DataGridViewHeaderBorderStyle.Single;
            this.dgwCupones.RowHeadersVisible = false;
            this.dgwCupones.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
            this.dgwCupones.RowsDefaultCellStyle.SelectionBackColor = Color.White;
            this.dgwCupones.RowsDefaultCellStyle.SelectionForeColor = ForeColor;
            this.dgwCupones.MultiSelect = false;
            this.dgwCupones.RowTemplate.Resizable = DataGridViewTriState.False;
            this.dgwCupones.AllowUserToAddRows = false;
            this.dgwCupones.RowTemplate.Height = 60;
            this.dgwCupones.AlternatingRowsDefaultCellStyle.BackColor = Color.AliceBlue;

            for (int i = 0; i < this.dgwCupones.ColumnCount; i++)
            {
                this.dgwCupones.Columns[i].Resizable = DataGridViewTriState.False;
                this.dgwCupones.Columns[i].ReadOnly = true;
            }

            this.dgwCupones.Columns["ProveedorRS"].Width = 120;
            this.dgwCupones.Columns["Rubro"].Width = 60;
            this.dgwCupones.Columns["Precio"].Width = 40;
            this.dgwCupones.Columns["Precio"].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight;
            this.dgwCupones.Columns["Descripcion"].Width = 180;
            this.dgwCupones.Columns["Descripcion"].DefaultCellStyle.Alignment = DataGridViewContentAlignment.TopLeft;
            this.dgwCupones.Columns["Descripcion"].DefaultCellStyle.WrapMode = DataGridViewTriState.True;
            this.dgwCupones.Columns["Codigo"].Visible = false;
            this.dgwCupones.Columns["IdProveedor"].Visible = false;
            this.dgwCupones.Columns["Stock"].Visible = false;
            this.dgwCupones.Columns["CantMax"].Visible = false;
        }

        private void ComprarCupon(string codigoCupon, int stock, int cantMaxXCli, int IdCliente, string fechaActual)
        {
            if (stock > 0)
            {
                _clienteBal.ComprarCupon(codigoCupon, stock, cantMaxXCli, IdCliente, fechaActual);
            }
            else
            {
                throw new CuponSinStockException("No hay stock para este cupon");
            }
        }

        private void btnSalir_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void cmboCiudades_SelectedValueChanged(object sender, EventArgs e)
        {
            if (!this._primeraCarga)
            {
                if (this.cmboCiudades.SelectedValue != null)
                {
                    this.CargarGrillaCupones();
                }
            }
        }
    }
}
